package org.posupe.candidatos;


public class RepositorioCandidatosLista {
	private Candidato candidato;

	private RepositorioCandidatosLista proximo;

	private int tamanho;

	public void inserir(Candidato candidato) {
		if (this.candidato == null) {
			this.candidato = candidato;
			this.proximo = new RepositorioCandidatosLista();
		} else {
			this.proximo.inserir(candidato);
		}

		this.tamanho++;
	}

	public void atualizar(Candidato candidato) {
		if (this.candidato != null) {
			if (this.candidato.getCpf() == candidato.getCpf()) {
				this.candidato = candidato;
			} else {
				this.proximo.atualizar(candidato);
			}
		} else {
			throw new RuntimeException("Candidato inexistente.");
		}
	}

	public void remover(String cpf) {
		if (this.candidato != null) {
			if (this.candidato.getCpf().equals(cpf)) {
				this.candidato = this.proximo.candidato;
				this.proximo = this.proximo.proximo;
			} else {
				this.proximo.remover(cpf);
			}

			this.tamanho--;
		} else {
			throw new RuntimeException("Candidato inexistente.");
		}
	}

	public Candidato procurar(String cpf) {
		Candidato retorno = null;

		if (this.candidato != null) {
			if (this.candidato.getCpf().equals(cpf)) {
				retorno = this.candidato;
			} else {
				retorno = this.proximo.procurar(cpf);
			}
		} else {
			throw new RuntimeException("Candidato inexistente.");
		}

		return retorno;
	}

	public boolean existe(String cpf) {
		boolean retorno = false;
		if (this.candidato != null) {
			if (this.candidato.getCpf().equals(cpf)) {
				retorno = true;
			} else {
				this.proximo.existe(cpf);
			}
		}
		return retorno;
	}

	public RepositorioCandidatosLista procurar(Candidato candidato) {
		RepositorioCandidatosLista retorno = new RepositorioCandidatosLista();
		Candidato candidatos[] = this.getIterator();

		for (int i = 0; i < candidatos.length; i++) {
			if (candidatos[i].match(candidato)) {
				retorno.inserir(candidatos[i]);
			}
		}

		return retorno;
	}

	public Candidato[] getIterator() {
		Candidato[] retorno = new Candidato[this.tamanho];
		RepositorioCandidatosLista proximo = null;
		int contador = 0;

		if (retorno.length > 0) {
			retorno[contador] = this.candidato;
			contador++;
		}

		proximo = this.proximo;

		while (contador < retorno.length) {
			retorno[contador] = proximo.candidato;
			proximo = proximo.proximo;
			contador++;
		}

		return retorno;
	}

}
